package com.ssy.lingxi.order.service.feign;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.model.bo.InventoryProductBO;
import com.ssy.lingxi.order.model.bo.VendorProductBO;
import com.ssy.lingxi.order.model.dto.*;

import java.util.List;
import java.util.Map;

/**
 * 商品服务Feign接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-30
 */
public interface IProductFeignService {
    /**
     * 批量校验商品价格
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId 采购会员角色Id
     * @param shopId 商城Id
     * @param memberType 会员类型，用于判断是会员商品，还是渠道商品
     * @param skuIds 商品SkuId列表
     * @return 校验结果
     */
    Wrapper<Map<Long, Map<String, Double>>> batchCheckProductPrice(Long buyerMemberId, Long buyerRoleId, Long shopId, Integer memberType, List<Long> skuIds);

    /**
     * 扣减供应商库存
     * @param buyerMemberId   采购会员Id
     * @param buyerRoleId     采购会员角色Id
     * @param orderId         订单Id
     * @param shopId          商城Id
     * @param shopType        商城类型（用于判断是渠道商城还是会员商城）
     * @param products        商品和采购数量
     * @return 操作结果
     */
    Wrapper<Void> deductInventory(Long buyerMemberId, Long buyerRoleId, Long orderId, Long shopId, Integer shopType, List<InventoryProductBO> products);

    /**
     * 返还供应商库存
     * @param buyerMemberId   采购会员Id
     * @param buyerRoleId     采购会员角色Id
     * @param orderId         订单Id
     * @param shopId          商城Id
     * @param shopType        商城类型（用于判断是渠道商城还是会员商城）
     * @param products        商品和返还数量
     * @return 操作结果
     */
    Wrapper<Void> resumeInventory(Long buyerMemberId, Long buyerRoleId, Long orderId, Long shopId, Integer shopType, List<InventoryProductBO> products);

    /**
     * 根据订单中的上游供应商与供应商商品，查询上游供应商商品信息
     * @param roleId         当前订单供应商要转单的服务消费者角色Id
     * @param vendorProducts 供应商会“会员商品”SkuId列表
     * @return 上游供应商“会员商品”列表
     */
    Wrapper<List<SupplyProductDTO>> findSupplyProducts(Long roleId, List<VendorProductBO> vendorProducts);

    /**
     * 更新商品售卖数量
     * @param shopId  商城Id
     * @param shopType 商城类型枚举
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param buyerMemberName 采购会员名称
     * @param skuQuantities 商品SkuId+采购数量
     */
    void updateProductSoldCountAsync(Long shopId, Integer shopType, Long buyerMemberId, Long buyerRoleId, String buyerMemberName, List<OrderProductStockDTO> skuQuantities);

    /**
     * 查询商品详细信息
     * @param shopId 商城Id
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId 采购会员角色Id
     * @param buyerMemberLevelType 采购会员等级类型
     * @param products 商品SkuId列表
     * @return 转换后的商品信息列表
     */
    Wrapper<List<OrderProductDetailDTO>> findProductDetails(Long shopId, Long buyerMemberId, Long buyerRoleId, Integer buyerMemberLevelType, List<ProductSkuDTO> products);

    /**
     * 查询Srm订单物料一级品类
     * @param productIds 物料商品Id列表
     * @return 查询结果
     */
    List<OrderProductCategoryDTO> findProductCategories(List<Long> productIds);
}
